值的存取应用2.0 | Web3.0 dApp 开发(四)
历史文章:
eth.build 快速上手 | Web3.0 dApp 开发(一)
在 1.0 的版本中,我们创建了一个简单的存值读值的dApp及其配套合约,并将其部署到了 Github-Pages上。
今天,我们对 1.0 的版本进行升级,让他变得更酷,我们甚至能给这个应用设计一个简单的经济模型!
注: 本文对 Austin Griffith 的分享有所参考——
以太坊核心开发者Austin | 如何在以太坊上构建应用程序?
Repo URL(注意所在分支):
https://github.com/leeduckgo/set-purpose/tree/feat/v0x02
https://github.com/leeduckgo/set-purpose-contracts/tree/feat/check_sender
0x01 让合约文件夹成为项目的子 Repo
在 Repo 中,我们会注意到 contracts 文件夹中实质存放的是另一个 Repo,这里用到了 git 中的submodule
功能。
对于智能合约来说,这样做的好处是,可能对于同一个dApp来说,有不同的合约版本。例如对于 NFT 项目来说,有普通版、白名单版、可升级版等等,这个时候设置智能合约为 submodule,那么我们就可以在该文件夹中独立切换合约了。而不用再把合约移来移去。
以下是一些submodule
相关的git操作:
# 在该目录下添加 submodule
git submodule add submodule-repository-URL
# example:
# git submodule add https://github.com/leeduckgo/set-purpose-contracts.git
# 在 clone 的时候即下载子模块
git clone --recurse-submodules repository-URL
# 手动拉取指定 submodule
git submodule update --init folder-path
# example:
# git submodule update packages/hardhat/contracts --init
0x02 给 setPurpose 函数加上权限控制
在原有的 PurposeHandler
基础上,我们通过 require
语句给 setPurpose
函数添加了权限控制。当合约调用人不是构造函数中赋值的owner
的时候,就会报错并不执行下面的语句。
pragma solidity >=0.8.0 <0.9.0;
//SPDX-License-Identifier: MIT
import "hardhat/console.sol";
contract PurposeHandler {
//event SetPurpose(address sender, string purpose);
string public purpose = "Building Unstoppable Apps";
address public owner = 0x7EF99B0E5bEb8ae42DbF126B40b87410a440a32a;
// 这里填写你自己的地址
constructor() {
// owner = msg.sender;
}
function setPurpose(string memory newPurpose) public {
// about msg.sender:
// https://cryptozombies.io/en/lesson/2/chapter/3
// about require:
// https://cryptozombies.io/en/lesson/2/chapter/4
require( msg.sender == owner, "NOT THE OWNER!");
purpose = newPurpose;
console.log(msg.sender,"set purpose to",purpose);
//emit SetPurpose(msg.sender, purpose);
}
}
TIPS:
关于 msg.sender 看: https://cryptozombies.io/en/lesson/2/chapter/3
关于 require 看: https://cryptozombies.io/en/lesson/2/chapter/4
回到 set-purpose 根目录,启动本地链、部署合约、启动dApp:
export SKIP_PREFLIGHT_CHECK=true # 设置环境变量
yarn chain # 启动链
yarn deploy # 部署合约
yarn start # 启动dApp
访问http://localhost:3000
。
由 Owner 发起交易的演示:
非 Owner 发起交易:
TIPS:
如果账户发生 Nonce 相关错误,重置 Nonce 即可:
Metamask > Settings > Advanced > Reset Account
0x03 Web3.0 dApp Dev 训练营
1. Web3.0 是下一代的互联网范式,Web3.0 dApp 是下一代区块链应用范式,这两个方面都存在很多全新的机会
2. 当前,国内和国际的计算机生态、互联网生态和区块链生态均存在一定程度的隔阂。web3.0 dApp 开发训练营的宗旨是帮助国内开发者、区块链从业人士与学生接触最前沿最酷的区块链开发工具与区块链开发范式。
3. 本期训练营 10 月 30 号(本周日)晚 8:00 开班
报名请加下方报名群,联系群内「一点知道」客服号:
Web3.0 dApp 开发学习路径(最新):
上面图片的有链接版本点击「阅读原文」查看。